package BinaryGenotype;

import Generic.Genotype;

public class BinaryGenotype implements Genotype {
	
	private byte bytes[];
	
	public BinaryGenotype(int length)
	{
		bytes = new byte[length];
	}
	
	public void randomize()
	{
		for(int i = 0; i<bytes.length;i++)
		{
			bytes[i]= (Math.random()<.5) ? (byte)0:(byte)1;
		}
	}
	
	public String toString()
	{
		String str="";
		for(int i =0; i<bytes.length;i++)
		{
			str+=bytes[i]==(byte)1?"1":"0";
		}
		return str;
	}

	public byte getBit(int i) {
		return bytes[i]; 
	}

	public Genotype copy() {
		BinaryGenotype ret = new BinaryGenotype(bytes.length);
		ret.bytes = this.bytes.clone();
		return ret;
	}

	public void setBit(int index,byte bit) {
		bytes[index]=bit;
	}

	public int getSize() {
		return bytes.length;
	}

	public void mutate(double mutationRate) {
		for(int i = 0; i<bytes.length; i++)
		{
			if(Math.random()<mutationRate)
			{
				bytes[i]=(byte)(1-bytes[i]);
			}
		}
	}

	public void onePointCrossover(Genotype gtype) {
		BinaryGenotype bgType = (BinaryGenotype)gtype;
		
		for(int i = 0; i < bytes.length*Math.random() ;i++)
		{
			byte temp = bgType.bytes[i];
			bgType.bytes[i]= bytes[i];
			bytes[i] = temp;
		}
	}

	public void uniformCrossover(Genotype gtype) {
		BinaryGenotype bgType = (BinaryGenotype)gtype;
		for(int i = 0; i < bytes.length;i++)
		{
			if(Math.random()<.5)
			{
				byte temp = bgType.bytes[i];
				bgType.bytes[i]= bytes[i];
				bytes[i] = temp;
			}
		}
	}
}
